﻿using System;
using ControleRepresentante.Common;
using ControleRepresentante.Migration.Models;
using ControleRepresentante.Migration.Repositories;

namespace ControleRepresentante.Migration.Steps
{
    internal class PedidoMigrateStep : MigrationStepBase
    {
        public override void Migrate(Guid representanteId, MigrationStatus migrationStatus, ControleRepresentanteRepository controleRepresentanteRepository, ZTRepository ztRepository, Guid userId)
        {
            migrationStatus.CurrentStep = "Migrate Pedidos";

            int total = ztRepository.GetTotalPedidos();

            int index = 0;
            ztRepository.GetPedidos().ExecuteBatch(5000, ztpedidos =>
            {
                foreach (ZTPedido ztPedido in ztpedidos)
                {
                    Guid pedidoId = GetPedidoId(ztPedido.Id);
                    Guid clienteId = GetClienteId(ztPedido.IdCliente);
                    Guid fabricaId = GetFabricaId(ztPedido.IdFabrica);
                    Guid transportadoraId = GetTransportadoraId(ztPedido.IdTransportadora);
                    Guid vendedorId = GetVendedorId(ztPedido.IdVendedor);

                    double desconto;
                    if (!Double.TryParse(ztPedido.Desconto, out desconto))
                    {
                        desconto = 0;
                    }

                    if (Math.Abs(ztPedido.CalculatedTotal - ztPedido.Total) > 2)
                    {
                        if (desconto == 0)
                        {
                            double calculatedDesconto = 100 * (1 - (ztPedido.Total / ztPedido.CalculatedTotal));
                            if (calculatedDesconto > 0)
                            {
                                desconto = calculatedDesconto;
                            }
                        }
                    }

                    controleRepresentanteRepository.CreatePedido(representanteId, pedidoId, clienteId, fabricaId, transportadoraId, vendedorId, ztPedido.CondicaoPagamento, ztPedido.Data, ztPedido.Observacao, ztPedido.PrazoEntrega, ztPedido.Id, ztPedido.Sincronizado, desconto, ztPedido.Faturado, ztPedido.Cancelado, ztPedido.CodigoJolitex);
                    if (!String.IsNullOrEmpty(ztPedido.ObservacaoBordados))
                    {
                        controleRepresentanteRepository.CreatePost(pedidoId, userId, ztPedido.Data, ztPedido.ObservacaoBordados);
                    }
                    migrationStatus.SetCurrentProgress(++index, total);
                }
            });
        }
    }
}